// 产品类
class Product {
  constructor() {
    this.parts = [];
  }

  add(part) {
    this.parts.push(part);
  }

  show() {
    console.log("产品包含以下部分：");
    this.parts.forEach((part) => {
      console.log(part);
    });
  }
}

// 抽象建造者接口
class Builder {
  constructor() {
    this.product = new Product();
  }

  buildPartA() {
    throw new Error("抽象方法不能调用");
  }

  buildPartB() {
    throw new Error("抽象方法不能调用");
  }

  getResult() {
    return this.product;
  }
}

// 具体建造者类
class ConcreteBuilder extends Builder {
  buildPartA() {
    this.product.add("部分A");
  }

  buildPartB() {
    this.product.add("部分B");
  }
}

// 指挥者类
class Director {
  constructor(builder) {
    this.builder = builder;
  }

  construct() {
    this.builder.buildPartA();
    this.builder.buildPartB();
  }
}

// 客户端代码
const builder = new ConcreteBuilder();
const director = new Director(builder);

director.construct();
const product = builder.getResult();
product.show();
// 输出：
// 产品包含以下部分：
// 部分A
// 部分B
